/**
 * 
 */
package fr.alma.coeur;

import java.util.ArrayList;

import fr.alma.observation.Observable;
import fr.alma.observation.Observateur;

/**
 * Classe de gestion des log.
 * @author AUBERT Sebastien
 * @author BOUVET Frederic
 * @author BRAUD Jeremy
 * @author KROMMENHOEK Cedric
 *
 */
public class Loggeur implements Observable {
	
	/**
	 * La liste des observateurs.
	 */
	private ArrayList<Observateur> listeObservateur;
	/**
	 * Le message recu.
	 */
	private String message;
	/**
	 * L'instance unique du loggeur.
	 */
	private static Loggeur instance = null;
	
	/**
	 * Constructeur.
	 */
	protected Loggeur() {
		this.listeObservateur = new ArrayList<Observateur>();
		instance = this;
	}

	/**
	 * Methode d'acces au loggeur.
	 * @return l'instance unique du loggeur
	 */
	public static Loggeur getLoggeur() {
		if (!Loggeur.estInstancie()) {
			instance = new Loggeur();
		}
		return instance;
	}
	
	/**
	 * Methode verifiant que le loggeur a ete instancie.
	 * @return vrai si le loggeur est instancie
	 */
	public static boolean estInstancie() {
		return (instance != null);
	}	
	
	/**
	 * Methode de reception des messages.
	 * @param messageRecu le message
	 */
	public void log(String messageRecu) {
		this.message = messageRecu;
		this.updateObservateurs();
	}
	
	/** 
	 * Methode d'acces au message.
	 * @return le message
	 */
	public String getMessage() {
		return this.message;
	}
	
	/**
	 * Ajoute un observateur.
	 * @param observateur l'observateur a ajouter
	 */
	@Override
	public void ajoutObservateur(Observateur observateur) {
		this.listeObservateur.add(observateur);
	}

	/**
	 * Met a jour les observateurs.
	 */
	@Override
	public void updateObservateurs() {
		for (Observateur obs : this.listeObservateur) {
			obs.update(this.message);
		}
	}
	
	/**
	 * Methode renvoyant le nombre d'observateurs.
	 * @return le nombre d'observateurs.
	 */
	public int nombreObservateurs() {
		return this.listeObservateur.size();
	}

}
